// Generated using webpack-cli https://github.com/webpack/webpack-cli
// nodejs 内置的一个path 模块, 用来处理路径path 的
const path = require("path");
const HtmlWebpackPlugin = require("html-webpack-plugin");
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
// 引入vue loader 
const VueLoaderPlugin = require("vue-loader/lib/plugin");

const isProduction = process.env.NODE_ENV == "production";

const stylesHandler = MiniCssExtractPlugin.loader;


// console.log(path.resolve(__dirname, "dist"));=> E:\webpack\2214-webpack5\dist
const config = {
  // 项目打包的入口文件, 执行webpack打包时,打包的入口是该文件
  // 在vue 中 打包的入口文件是 main.js 可以将所有的依赖包 都引入该入口文件, 然后项目打包时自动会将
  // 引入文件打包处理
  // 在react 中打包的入口文件为 index.js 原理同上
  // entry: "./src/index.js", 单入口文件配置方式
  // entry: {  // 多入口文件的配置方式
  //   index: './src/index.js',
  //   login: './src/login.js'
  // },
  entry: "./src/main.js",
  // 项目打包后的出口文件
  output: {
    path: path.resolve(__dirname, "dist"),
  },
  devServer: { // 设置本地服务器的一些配置项
    open: true, // 是否打开浏览器
    host: "localhost", // 项目运行在本地的域名地址
    port: 8090, // 设置端口号
    proxy: {  // 设置代理配置
      '/api': {
        target: "http://kumanxuan1.f3322.net:8001",
        changeOrigin: true,
        // pathRewrite: {
        //     '^/api': ''
        // }
      }
    }
  },
  plugins: [ // 用来配置插件
    new HtmlWebpackPlugin({
      template: "index.html",
    }),
    // 该插件用来将css 文件进行抽离成单独的css 文件, 放在dist目录下
    new MiniCssExtractPlugin({
      filename: "css/[name]_[hash:6].css",  // css 打包后输出的文件地址
    }),
    new VueLoaderPlugin(), // 配置vue-loader 插件

  ],
  module: {  // 用来配置loader
    rules: [
      {
        test: /\.vue$/,
        loader: "vue-loader",
      },
      {
        // 当js文件中包含 更高级的js语法时, 比如说使用es7,8,9,这时候使用babel-loader 将其编译成es5 
        test: /\.(js|jsx)$/i,
        loader: "babel-loader",
      },
      {
        test: /\.less$/i,  // 当处理项目中的less文件时,使用less-loaderm将其编译成css 语法
        use: [stylesHandler, "css-loader", "postcss-loader", "less-loader"],
      },
      {
        test: /\.css$/i,  // / 当处理项目中的css文件时,使用css-loader将其编译成css 语
        use: [stylesHandler, "css-loader", "postcss-loader"],
      },
      {
        test: /\.(png|jpeg|jpg|gif)$/i,
        type: 'asset/resource',
        generator: {
          filename: 'img/[name][ext]'
        },
        use: [
          {
            loader: 'image-webpack-loader',
            options: {
              mozjpeg: { // 配置压缩 jpeg图片
                progressive: true,
                quality: 65
              },
              optipng: { //配合pngquant一起使用,共同压缩png图片
                enabled: false,
              },
              pngquant: { //压缩png图片
                quality: '65-90',
                speed: 4
              },
              gifsicle: { // 压缩 gif
                interlaced: false,
              },
              webp: { // 压缩webp
                quality: 75
              }
            }
          }
        ]

      },
      {
        test: /\.html$/,
        // 处理html中的img,负责引入img
        use: [
          { loader: "html-loader" },
        ]
      }

      // Add your rules for custom modules here
      // Learn more about loaders from https://webpack.js.org/loaders/
    ],
  },
  resolve: { // 配置一些 路径别名
    alias: {
      "@": path.resolve(__dirname, 'src')
    }
  },
  externals: {  // 表示打包的时候不打包该配置项中的包,
    // 可以通过cdn方式导入第三方包, 这样节省本地包的提交.做到项目优化
    jquery: 'jQuery'
  }
};

module.exports = () => {
  if (isProduction) {
    config.mode = "production";
  } else {
    config.mode = "development";
  }
  return config;
};
